/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BL;

import BE.BEPallet;
import BE.BEPosicion;
import BE.*;
import DA.DAPosicionxrack;
import DA.DARack;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;

/**
 *
 * @author hunter2409
 */
public class BLInternamiento {
    
    BLZona objGestorZona;
    BLRack objGestorRack;
    BLPallet objGestorPallet;
    BLTipoProducto objGestorTipoProd;
    BLPosicionxrack objGestorPoscicionRack;
    BERack objRack;
    BEPosicionxRack objAuxPos;
    int idTipoProducto;
    private PriorityQueue<BEPosicionxRack> pQueque;
    
    public BLInternamiento(int idTipo)
    {
        objGestorPallet= new BLPallet();
        objGestorRack = new BLRack();
        objGestorZona= new BLZona();
        objGestorTipoProd= new BLTipoProducto();
        objGestorPoscicionRack = new BLPosicionxrack();
        Comparator<BEPosicionxRack> comparator = new CompararPos();
        pQueque = new PriorityQueue<BEPosicionxRack>(10, comparator);
        objRack= null;
    }
    
    
    
     public class CompararPos implements Comparator<BEPosicionxRack>
    {
        BLZona objGestorZona;
        BLRack objGestorRack;
        
        public CompararPos()
        {
            objGestorZona= new BLZona();
            objGestorRack = new BLRack();
            //objGestorZona.obtenerZonasByTipo(IdTipoProd);
            // se llena el gestor con los racks q solo adminten cierto tipo de productos
            objGestorRack.cargar();
        }
        
        @Override
        public int compare(BEPosicionxRack pos1, BEPosicionxRack pos2) {
            
           
            BERack auxRack1= objGestorRack.buscarRackPorId(pos1.getIdrack());
            
            BERack auxRack2= objGestorRack.buscarRackPorId(pos2.getIdrack());
            
            
            //hacer la distancia manhatan de cada uno de los racks 
            //luego comparar
            if ((auxRack1.getPosicion().getFila()+auxRack1.getPosicion().getColumna())<(auxRack2.getPosicion().getFila()+auxRack2.getPosicion().getColumna())) return -1;
           
            if ((auxRack1.getPosicion().getFila()+auxRack1.getPosicion().getColumna())>(auxRack2.getPosicion().getFila()+auxRack2.getPosicion().getColumna())) return 1;
            
            if ((auxRack1.getPosicion().getFila()+auxRack1.getPosicion().getColumna())==(auxRack2.getPosicion().getFila()+auxRack2.getPosicion().getColumna()))
            {
                
                if ((pos1.getFila())<(pos2.getFila())) return -1;
                
                if ((pos1.getFila())>(pos2.getFila())) return 1;
                
                if ((pos1.getFila())==(pos2.getFila()))
                {
                    
                    if ((pos1.getColumna())<(pos2.getColumna())) return -1;
                    
                    if ((pos1.getColumna())>(pos2.getColumna())) return 1;
                    
                    return 0;
                }
                
            }
            
            
            return 0;
        }
        
    }
    
    public BEPosicion buscarPosicionInternamiento(BEPallet objPallet)
    {
        //objPallet.getProducto().getIdTipoProducto();
        objGestorPoscicionRack.cargarPosicionesPorTipoProducto(objPallet.getProducto().getIdTipoProducto());
        objAuxPos= null;
        
        //lleno mi cola de prioridad
        
        for (BEPosicionxRack pos:objGestorPoscicionRack.getLstPosicion()) pQueque.add(pos);
        
        //
        
        if (pQueque.size()>0)  objAuxPos=pQueque.remove();
        
            
        if (objAuxPos==null) return null;
        
        objAuxPos.setIdpallet(objPallet.getIdPallet());
        
        objRack = objGestorRack.getRackbyId(objAuxPos.getIdrack());
        
        BEPosicion auxPosFinal = new BEPosicion();
        
        auxPosFinal.setFila(objRack.getPosicion().getColumna()+objAuxPos.getColumna()-1);
        auxPosFinal.setColumna(objRack.getPosicion().getFila());
              
        
        return auxPosFinal;

    }


    public BERack obtenerRack() {
        return objRack;
    }
    
    public BEPosicionxRack obtenerPosiciondelRack()
    {
        return objAuxPos;
    }
   
    
    
    
}
